﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using TicketsPhone.Domain.Entities;
using System.Data;

namespace TicketsPhone.Domain.Access
{
    public class EntidadRepositorio : ConexionSql<Entidad>, ICrud<Entidad>
    {

        public int Crear()
        {
            CrearComando("spEntidad_Crear");
            AgregarParametros();
            return Convert.ToInt32(ExecuteScalar());
        }

        public bool Editar()
        {
            CrearComando("spEntidad_Editar");
            AgregarParametros();
            return ExecuteNonQuery() > 0;
        }

        public bool Eliminar(int id)
        {
            CrearComando("spEntidad_Eliminar");
            AgregarParametro("@idEntidad", id, ParameterDirection.Input, DbType.Int32);
            return ExecuteNonQuery() > 0;
        }

        public Entidad Cargar(int id)
        {
            Entidad objeto = new Entidad();
            CrearComando("spEntidad_Cargar");
            AgregarParametro("@IdEntidad", id, System.Data.ParameterDirection.Input, System.Data.DbType.Int32);
            ExecuteReader();

            while (Read())
            {
                objeto = new Entidad(GetDataReader());
            }

            return objeto;
        }

        public List<Entidad> ObtenerTodos()
        {
            return ObtenerTodos(false);
        }

        /// <summary>
        /// Retorna todas las entidades de acuerdo a un filtro
        /// </summary>
        /// <returns>Lista de entidades</returns>
        public List<Entidad> ObtenerTodos(bool soloActivos)
        {
            List<Entidad> lista = new List<Entidad>();
            CrearComando("spEntidad_Obtener");

            if(soloActivos)
                AgregarParametro("@activo", true, ParameterDirection.Input, DbType.Boolean);

            ExecuteReader();

            while (Read())
            {
                lista.Add(new Entidad(GetDataReader()));
            }

            return lista;
        }

        public List<Entidad> ObtenerActivos()
        {
            return ObtenerTodos(true);
        }

        public void GuardarTransaccion(TipoTransaccion tipoTransaccion)
        {
            throw new NotImplementedException();
        }


        public List<Entidad> Filtrar()
        {
            List<Entidad> lista = new List<Entidad>();
            CrearComando("spEntidad_Filtrar");
            AgregarParametro("@Nombre", Objeto.Nombre, System.Data.ParameterDirection.Input, System.Data.DbType.String);
            ExecuteReader();

            while (Read())
            {
                Entidad obj = new Entidad();
                obj.IdEntidad = GetIntValue("IdEntidad");
                obj.Nombre = GetStringValue("Nombre");
                obj.Activo = GetBooleanValue("Activo");
                obj.FechaModificacion = GetDateValue("FechaModificacion");
                obj.Pais.Nombre = GetStringValue("NombrePais");
                lista.Add(obj);
            }

            return lista;
        }

        private void AgregarParametros()
        {
            AgregarParametro("@IdEntidad", Objeto.IdEntidad, ParameterDirection.Input, DbType.Int32);
            AgregarParametro("@Nombre", Objeto.Nombre, ParameterDirection.Input, DbType.String);
            AgregarParametro("@Descripcion", Objeto.Descripcion, ParameterDirection.Input, DbType.String);
            AgregarParametro("@Activo", Objeto.Activo, ParameterDirection.Input, DbType.Boolean);
            AgregarParametro("@IdPais", Objeto.Pais.IdPais, ParameterDirection.Input, DbType.Int32);
            AgregarParametro("@FechaModificacion", Objeto.FechaModificacion, ParameterDirection.Input, DbType.DateTime);
        }
    }
}
